"""
@Author: li
@Email: lijianqiao2906@live.com
@FileName: initializer.py
@DateTime: 2025/07/07
@Docs: 权限系统初始化器
"""

from app.services.permission.generator import PermissionGenerator
from app.utils.logger import logger

# 在这里定义需要自动生成CRUD权限的核心模型列表
# 未来新增模型，只需在此列表中添加模型名称即可
MODELS_TO_REGISTER = ["User", "Role", "Permission", "Menu", "SystemConfig"]


def register_system_permissions() -> None:
    """自动扫描并注册系统基础权限"""
    logger.info("开始自动注册系统权限...")

    for model_name in MODELS_TO_REGISTER:
        generator = PermissionGenerator(model_name=model_name, module_name="system")
        generator.generate_and_register()
        logger.debug(f"为模型 '{model_name}' 自动生成并注册权限。")

    # 在这里可以继续注册一些非标准的、特殊的权限
    register_log_permissions()

    logger.info("系统权限自动注册完成。")


def register_log_permissions() -> None:
    """注册日志相关的特殊权限"""
    from app.services.permission.registry import permission_registry

    # 为用户分配角色的权限
    permission_registry.register(
        code="user:assign_roles",
        name="分配角色",
        description="允许为用户分配角色",
        module="system",
        resource="user",
        action="assign_roles",
        type="operation",
    )

    # 操作日志权限
    permission_registry.register(
        code="log:operation:read",
        name="查看操作日志",
        description="允许用户查看系统操作日志",
        module="system",
        resource="log_operation",
        action="read",
        type="data",
    )

    # 登录日志权限
    permission_registry.register(
        code="log:login:read",
        name="查看登录日志",
        description="允许用户查看系统登录日志",
        module="system",
        resource="log_login",
        action="read",
        type="data",
    )


async def sync_permissions_to_database() -> None:
    """
    将代码中注册的权限信息同步到数据库中。
    这是连接"代码定义"和"后台分配"的关键。
    """
    from app.services.system import permission_service

    logger.info("开始同步权限到数据库...")
    try:
        synced_count = await permission_service.sync_permissions_from_registry()
        logger.info(f"权限同步完成，共同步 {synced_count} 个权限。")
    except Exception as e:
        logger.error(f"权限同步失败: {e}", exc_info=True)


def initialize_permissions() -> None:
    """
    初始化整个权限系统。
    该函数应在应用启动时调用。
    """
    # 1. 清空旧的注册表，以防热重载时重复注册
    from app.services.permission.registry import permission_registry

    permission_registry.clear()

    # 2. 从代码中注册所有权限到内存注册表
    register_system_permissions()

    logger.info("权限系统初始化完成。")
    # 注意：数据库同步将在应用启动事件中异步调用
